#ifndef __BE_DEFINE__
#define __BE_DEFINE__

#define __FASTCALL //__attribute__ ((fastcall));

#define PI 3.1416


class StringHash;
class VM;
class Cmd;
class Param;
class Scriptable;
class Render;
class OSMesaRender;
class SceneManager;
class ResourceManager;
class ProcessorManager;
class World;
class Scene;
class Processor;
class Layer;
class Object;
class Mesh;
class GLMesh;
class Mesh2;
class Sprite;
class SpriteSheet;
class Track;
class LinearTrack;
class CircularTrack;
class Controller;
class LocationController;


//----------------
// For testing purpose

class TestProcessor;
typedef boost::shared_ptr<TestProcessor> TestProcessorPtr;
//----------------


typedef std::string String;
typedef boost::shared_ptr<String> StringPtr;
typedef boost::shared_ptr<Cmd> CmdPtr;
typedef boost::shared_ptr<Param> ParamPtr;
typedef boost::shared_ptr<VM> VMPtr;
typedef boost::shared_ptr<Scriptable> ScriptablePtr;
typedef boost::shared_ptr<Render> RenderPtr;
typedef boost::shared_ptr<OSMesaRender> OSMesaRenderPtr;
typedef boost::shared_ptr<SceneManager> SceneManagerPtr;
typedef boost::shared_ptr<ResourceManager> ResourceManagerPtr;
typedef boost::shared_ptr<ProcessorManager> ProcessorManagerPtr;
typedef boost::shared_ptr<World> WorldPtr;
typedef boost::shared_ptr<Scene> ScenePtr;
typedef boost::shared_ptr<Processor> ProcessorPtr;
typedef boost::shared_ptr<Layer> LayerPtr;
typedef boost::shared_ptr<Object> ObjectPtr;
//typedef boost::shared_ptr<Mesh> MeshPtr;
typedef boost::shared_ptr<GLMesh> GLMeshPtr;
typedef boost::shared_ptr<Mesh2> Mesh2Ptr;
typedef boost::shared_ptr<Sprite> SpritePtr;
typedef boost::shared_ptr<SpriteSheet> SpriteSheetPtr;
typedef std::tr1::unordered_set<String> StringSet;
typedef boost::shared_ptr<Track> TrackPtr;
typedef boost::shared_ptr<LinearTrack> LinearTrackPtr;
typedef boost::shared_ptr<CircularTrack> CircularTrackPtr;
typedef boost::shared_ptr<Controller> ControllerPtr;
typedef boost::shared_ptr<LocationController> LocationControllerPtr;

typedef Turple<float , 3> Turple3f;
typedef Turple<double, 3> Turple3d;
typedef Turple<int   , 3> Turple3i;
typedef Turple<float , 2> Turple2f;
typedef Turple<double, 2> Turple2d;
typedef Turple<int   , 2> Turple2i;
typedef Turple<int   , 1> Turple1i;
typedef Turple<float , 1> Turple1f;

typedef std::vector<Turple3f> Turple3fArray;
typedef std::vector<Turple3i> Turple3iArray;
typedef std::vector<Turple1i> Turple1iArray;
typedef std::list<ControllerPtr> ControllerList;

typedef long long INT64;
typedef int       INT32;
typedef short     INT16;
typedef unsigned long long UINT64;
typedef unsigned int       UINT32;
typedef unsigned short     UINT16;
typedef unsigned char BYTE;
//typedef size_t    HASH;
#endif
